iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 6
0
自我挑戰組

Codewars Ruby Challenge in 30 Days系列 第 6

Codewars Ruby Challenge - Day 6/30

  • 分享至 

  • xImage
  •  

學習

  1. hash 的應用:可以先用 key value 的方法寫出勝負表,再去判斷 value 是不是跟 p2 相同,就能判斷勝負
  2. hash 相關語法:學到「has_key(參數)」的新語法,可以用來看 hash 內是否有跟 參數 同名的 key。另外也複習了查詢 hash 內所有 value 跟 key 的方法,分別是 hash.values 與 hash.keys
  3. has 的宣告方式:有新舊以下兩種
old_hash = {"rock" => "scissors", "scissors" => "paper"}

好處:key 在設值時可以是 String、Symbol、Integer….多種型別,以這題的輸入值是 String 就可以順利拿來跟 hash 一開始設值為 String 的 key 比較,可以達成龍哥寫的「win_table[p1] == p2」判斷

new_hash = {rock: "scissors", scissors: paper }

新式是直接用 symbol 作為 hash 的 key,甚至可以少寫箭頭做指定 value,但當一樣在判斷「win_table[p1] == p2」時,會發現「win_table[p1]」找到 nil。因為此時 hash 的 key 型別是 symbol(:rock),而非 String("rock"),所以這題並不適合用新式 hash 來寫。


題目:

# 實作猜拳程式
def rock_paper_scissor(p1, p2)
  # 實作內容
end

答案需為:

puts rock_paper_scissor('rock', 'scissors')      # 印出 Player 1 won!
puts rock_paper_scissor('paper', 'rock')         # 印出 Player 1 won!
puts rock_paper_scissor('paper', 'scissors')     # 印出 Player 2 won!
puts rock_paper_scissor('rock', 'paper')         # 印出 Player 2 won!
puts rock_paper_scissor('rock', 'rock')          # 印出 Draw!
puts rock_paper_scissor('scissors', 'scissors')  # 印出 Draw!

我的答案

def rock_paper_scissor(p1, p2)
  if p1 == p2
    "Draw!"
  elsif (p1 == 'rock') && (p2 == 'scissors')
    "Player 1 won!"
  elsif (p1 == 'paper') && (p2 == 'rock')
    "Player 1 won!"
  elsif (p1 == 'paper') && (p2 == 'scissors')
    "Player 2 won!"
  elsif (p1 == 'rock') && (p2 == 'paper')
    "Player 2 won!"
  end
end

思路:

  1. 一開始想到可以先快速塞選掉平手的情況
  2. 後面又是想到窮取法反正猜拳只有9種可能,就一個個寫出判斷
  3. 有想過應該要先寫出勝負表,然後做些什麼判斷應該沒有很複雜才對,但寫不出來(這題算是只有解一半)

龍哥建議的答案

def rock_paper_scissor(p1, p2)
  win_table = {'rock' => 'scissors', 'scissors' => 'paper', 'paper' => 'rock'}

  if p1 == p2
    "Draw!"
  else
    if win_table.has_key?(p1) && win_table[p1] == p2
      "Player 1 won!"
    else
      "Player 2 won!"
    end
  end
end

(看到龍哥的答案真的太神,原來可以用 hash 搭配!)


上一篇
Codewars Ruby Challenge - Day 5/30
下一篇
Codewars Ruby Challenge - Day 7/30
系列文
Codewars Ruby Challenge in 30 Days30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言